/*
 * Copyright 2013 Joachim Ansorg, mail@ansorg-it.com
 * File: _BashLexer.java, Class: _BashLexer
 * Last modified: 2013-04-13
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* The following code was generated by JFlex 1.4.3 on 13.04.13 19:04 */

/*** JFlex specification for Bash ****
 The Bash language is a beast. It contains many strange or unusual constructs
 and has a great flexibility in what is possible.
 The lexer tries to do as much as possible in the lexing phase to help the parser
 later on.

 A major problem is that tokens have to interpreted according to their context.
 e.g. a=b echo a=b
 has an assignment in front and a string as parameter to the echo command. So the EQ
 token (for the = character) has to be remapped to a WORD later on (see BashTokenTypeRemapper).

 Another problem is that string can contain unescaped substrings, e.g.
 "$(echo hello "$(echo "world")")" is just one string. But this string contains
 two levels of embedded strings in the embedded subshell command.
 The lexer parses a string as STRING_BEGIN, STRING_CHAR and STRING_END. These
 tokens are mapped to a STRING later on by the lexer.MergingLexer class.

 Lexing all as a STRING token was the way to go. This worked, but for some strange
 reason the lexer got wrong offsets for this complex setup (returning the string only at the
 last occurence of "). That's why the token merging strategy was established.

 If you really want to hack on this lexer: Be careful :)
 There are unit tests for the lexer but there's no 100% coverage for all cases.

 @author Joachim Ansorg, mail@ansorg-it.com
 **/

/** Based on the arc lexer (http://code.google.com/p/intelli-arc/) **/

package com.ansorgit.plugins.bash.lang.lexer;

import com.intellij.lexer.FlexLexer;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.containers.Stack;

import static com.ansorgit.plugins.bash.lang.lexer.BashTokenTypes.*;


/**
 * This class is a scanner generated by
 * <a href="http://www.jflex.de/">JFlex</a> 1.4.3
 * on 13.04.13 19:04 from the specification file
 * <tt>src/com/ansorgit/plugins/bash/lang/lexer/bash.flex</tt>
 */
public class _BashLexer implements FlexLexer {
    /**
     * initial size of the lookahead buffer
     */
    private static final int ZZ_BUFFERSIZE = 16384;

    /**
     * lexical states
     */
    public static final int S_CASE = 12;
    public static final int S_BACKQUOTE = 28;
    public static final int S_ARITH_ARRAY_MODE = 10;
    public static final int S_CASE_PATTERN = 14;
    public static final int S_ARRAY = 20;
    public static final int S_ARITH_SQUARE_MODE = 8;
    public static final int S_TEST_COMMAND = 4;
    public static final int S_ASSIGNMENT_LIST = 22;
    public static final int S_PARAM_EXPANSION = 26;
    public static final int S_ARITH = 6;
    public static final int YYINITIAL = 0;
    public static final int S_SUBSHELL_PREFIXED = 18;
    public static final int S_SUBSHELL = 16;
    public static final int S_TEST = 2;
    public static final int S_STRINGMODE = 24;

    /**
     * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
     * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
     * at the beginning of a line
     * l is of the form l = 2*k, k a non negative integer
     */
    private static final int ZZ_LEXSTATE[] = {
            0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
            8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14
    };

    /**
     * Translates characters to character classes
     */
    private static final String ZZ_CMAP_PACKED =
            "\11\0\1\3\1\2\1\0\1\3\1\1\22\0\1\43\1\6\1\10" +
                    "\1\5\1\7\1\23\1\22\1\11\1\52\1\42\1\20\1\26\1\27" +
                    "\1\24\1\17\1\14\1\35\7\41\2\12\1\21\1\34\1\72\1\51" +
                    "\1\71\1\16\1\15\6\37\1\73\4\13\1\73\1\13\1\73\1\73" +
                    "\3\13\1\73\7\13\1\32\1\4\1\33\1\25\1\13\1\74\1\55" +
                    "\1\40\1\54\1\57\1\47\1\62\1\70\1\65\1\45\1\13\1\73" +
                    "\1\61\1\46\1\53\1\60\1\73\1\67\1\63\1\56\1\44\1\64" +
                    "\1\13\1\66\1\36\1\13\1\73\1\75\1\50\1\76\1\30\101\0" +
                    "\100\31\uff00\0";

    /**
     * Translates characters to character classes
     */
    private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);

    /**
     * Translates DFA states to action switch labels.
     */
    private static final int[] ZZ_ACTION = zzUnpackAction();

    private static final String ZZ_ACTION_PACKED_0 =
            "\21\0\1\1\2\2\1\3\1\4\1\5\1\6\1\7" +
                    "\1\10\1\1\1\11\2\12\1\13\1\14\2\12\1\15" +
                    "\1\11\1\16\3\12\1\17\1\20\1\21\6\12\1\22" +
                    "\1\23\1\24\1\25\1\26\1\27\1\7\1\14\1\12" +
                    "\1\30\1\3\1\17\3\31\1\14\1\3\1\4\1\32" +
                    "\1\7\1\33\1\12\1\34\1\12\1\35\1\36\1\37" +
                    "\1\40\1\41\1\42\1\43\1\44\1\45\1\46\1\47" +
                    "\1\50\1\33\1\51\1\20\1\52\1\53\1\54\1\55" +
                    "\1\56\1\57\1\1\1\15\3\12\1\4\1\5\1\7" +
                    "\1\12\1\13\1\14\1\15\1\60\1\12\1\22\1\23" +
                    "\1\24\1\25\1\61\3\12\1\62\6\12\1\63\1\1" +
                    "\1\11\1\64\1\11\1\4\2\12\1\65\1\66\1\22" +
                    "\1\23\3\67\1\70\1\71\1\4\1\72\1\73\1\74" +
                    "\1\75\1\76\1\77\1\100\1\101\1\102\1\14\1\103" +
                    "\1\104\1\105\1\106\1\107\1\110\1\111\1\112\2\0" +
                    "\2\113\3\5\1\114\1\0\1\115\1\0\1\115\1\116" +
                    "\1\117\1\0\1\120\2\12\1\121\1\122\1\123\1\122" +
                    "\1\124\1\125\1\12\1\126\2\12\1\127\1\130\1\12" +
                    "\1\131\1\132\1\133\2\12\1\134\1\135\4\12\1\0" +
                    "\1\136\1\137\1\0\1\140\1\141\1\0\4\31\2\12" +
                    "\1\142\1\143\1\144\1\0\1\12\1\145\5\0\1\146" +
                    "\1\147\1\150\1\123\1\151\1\152\1\153\1\154\1\155" +
                    "\1\156\1\0\1\157\1\160\1\161\1\162\1\163\1\164" +
                    "\1\165\2\0\1\166\1\167\1\170\1\12\1\113\1\114" +
                    "\2\115\1\116\1\12\1\120\1\12\1\137\2\12\1\127" +
                    "\1\130\3\12\1\134\1\135\5\12\1\0\2\12\1\171" +
                    "\1\74\1\0\1\172\1\173\1\174\1\175\1\176\7\0" +
                    "\3\114\1\120\1\177\2\0\2\12\1\200\1\201\1\202" +
                    "\1\203\7\12\1\204\3\12\1\205\1\0\1\205\1\206" +
                    "\1\0\1\206\1\207\1\210\1\211\1\212\1\0\1\213" +
                    "\1\214\4\0\3\215\1\216\1\217\1\220\1\221\1\222" +
                    "\1\12\1\120\10\12\1\204\3\12\1\0\1\223\4\0" +
                    "\1\114\1\224\1\225\1\226\1\227\1\230\1\231\1\232" +
                    "\1\12\1\233\3\12\1\225\1\0\1\215\1\0\1\234" +
                    "\1\235\1\226\1\227\1\230\1\231\1\232\1\12\1\233" +
                    "\5\12\1\236\1\237\2\215\2\12\1\236\1\237\1\240" +
                    "\1\12\1\240\3\12\2\241";

    private static int[] zzUnpackAction() {
        int[] result = new int[406];
        int offset = 0;
        offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
        return result;
    }

    private static int zzUnpackAction(String packed, int offset, int[] result) {
        int i = 0;       /* index in packed string  */
        int j = offset;  /* index in unpacked array */
        int l = packed.length();
        while (i < l) {
            int count = packed.charAt(i++);
            int value = packed.charAt(i++);
            do result[j++] = value; while (--count > 0);
        }
        return j;
    }


    /**
     * Translates a state to a row index in the transition table
     */
    private static final int[] ZZ_ROWMAP = zzUnpackRowMap();

    private static final String ZZ_ROWMAP_PACKED_0 =
            "\0\0\0\77\0\176\0\275\0\374\0\u013b\0\u017a\0\u01b9" +
                    "\0\u01f8\0\u0237\0\u0276\0\u02b5\0\u02f4\0\u0333\0\u0372\0\u03b1" +
                    "\0\u03f0\0\u042f\0\u046e\0\u042f\0\u042f\0\u04ad\0\u04ec\0\u052b" +
                    "\0\u056a\0\u042f\0\u05a9\0\u05e8\0\u0627\0\u052b\0\u052b\0\u0666" +
                    "\0\u06a5\0\u06e4\0\u042f\0\u052b\0\u042f\0\u0723\0\u0762\0\u07a1" +
                    "\0\u07e0\0\u042f\0\u081f\0\u085e\0\u089d\0\u08dc\0\u091b\0\u095a" +
                    "\0\u0999\0\u09d8\0\u0a17\0\u042f\0\u042f\0\u042f\0\u0a56\0\u0a95" +
                    "\0\u052b\0\u0ad4\0\u052b\0\u0b13\0\u0b52\0\u0b91\0\u0bd0\0\u042f" +
                    "\0\u0c0f\0\u0c4e\0\u0c8d\0\u0ccc\0\u0d0b\0\u0d4a\0\u0d89\0\u0dc8" +
                    "\0\u0e07\0\u0e07\0\u0e46\0\u0e07\0\u0e85\0\u0ec4\0\u0f03\0\u042f" +
                    "\0\u0f42\0\u042f\0\u042f\0\u042f\0\u042f\0\u0f81\0\u0fc0\0\u0fff" +
                    "\0\u103e\0\u107d\0\u10bc\0\u042f\0\u042f\0\u10fb\0\u0fff\0\u113a" +
                    "\0\u1179\0\u11b8\0\u11f7\0\u1236\0\u1275\0\u12b4\0\u12f3\0\u11f7" +
                    "\0\u11f7\0\u11f7\0\u042f\0\u1332\0\u1371\0\u11f7\0\u11f7\0\u11f7" +
                    "\0\u042f\0\u13b0\0\u13ef\0\u142e\0\u081f\0\u146d\0\u14ac\0\u14eb" +
                    "\0\u152a\0\u1569\0\u15a8\0\u042f\0\u15e7\0\u1626\0\u042f\0\u042f" +
                    "\0\u1665\0\u16a4\0\u16e3\0\u042f\0\u042f\0\u0bd0\0\u042f\0\u042f" +
                    "\0\u1722\0\u1761\0\u042f\0\u042f\0\u17a0\0\u042f\0\u042f\0\u17df" +
                    "\0\u042f\0\u042f\0\u042f\0\u042f\0\u042f\0\u181e\0\u042f\0\u042f" +
                    "\0\u042f\0\u042f\0\u042f\0\u185d\0\u042f\0\u042f\0\u042f\0\u189c" +
                    "\0\u18db\0\u191a\0\u1959\0\u1998\0\u19d7\0\u1a16\0\u1a55\0\u1a94" +
                    "\0\u042f\0\u05a9\0\u1ad3\0\u042f\0\u042f\0\u1b12\0\u042f\0\u1b51" +
                    "\0\u1b90\0\u1bcf\0\u1c0e\0\u052b\0\u052b\0\u1c4d\0\u042f\0\u1c8c" +
                    "\0\u1ccb\0\u1d0a\0\u1d49\0\u0627\0\u0627\0\u1d88\0\u042f\0\u042f" +
                    "\0\u042f\0\u1dc7\0\u1e06\0\u1e45\0\u0627\0\u1e84\0\u1ec3\0\u1f02" +
                    "\0\u1f41\0\u1f80\0\u042f\0\u042f\0\u1fbf\0\u042f\0\u1ffe\0\u203d" +
                    "\0\u052b\0\u207c\0\u20bb\0\u20fa\0\u20bb\0\u2139\0\u042f\0\u042f" +
                    "\0\u042f\0\u2178\0\u21b7\0\u042f\0\u21f6\0\u2235\0\u2274\0\u22b3" +
                    "\0\u22f2\0\u042f\0\u042f\0\u042f\0\u042f\0\u042f\0\u2331\0\u042f" +
                    "\0\u042f\0\u042f\0\u2370\0\u23af\0\u042f\0\u042f\0\u042f\0\u042f" +
                    "\0\u23ee\0\u042f\0\u242d\0\u246c\0\u24ab\0\u042f\0\u24ea\0\u0627" +
                    "\0\u2529\0\u2568\0\u25a7\0\u11f7\0\u25e6\0\u11f7\0\u2625\0\u11f7" +
                    "\0\u2664\0\u11f7\0\u26a3\0\u26e2\0\u052b\0\u052b\0\u2721\0\u2760" +
                    "\0\u279f\0\u27de\0\u052b\0\u281d\0\u285c\0\u289b\0\u28da\0\u2919" +
                    "\0\u2958\0\u042f\0\u2568\0\u2997\0\u29d6\0\u2a15\0\u042f\0\u042f" +
                    "\0\u042f\0\u042f\0\u042f\0\u2a54\0\u2a93\0\u2ad2\0\u2b11\0\u2b50" +
                    "\0\u04ad\0\u2b8f\0\u2bce\0\u042f\0\u2c0d\0\u05a9\0\u2c4c\0\u2c8b" +
                    "\0\u2cca\0\u2d09\0\u2d48\0\u042f\0\u042f\0\u042f\0\u042f\0\u2d87" +
                    "\0\u2dc6\0\u2e05\0\u2e44\0\u2e83\0\u2ec2\0\u2f01\0\u0627\0\u2f40" +
                    "\0\u2f7f\0\u2fbe\0\u042f\0\u2ffd\0\u303c\0\u042f\0\u307b\0\u30ba" +
                    "\0\u042f\0\u042f\0\u042f\0\u042f\0\u0c8d\0\u042f\0\u2235\0\u30f9" +
                    "\0\u3138\0\u3177\0\u2331\0\u31b6\0\u042f\0\u31f5\0\u23af\0\u042f" +
                    "\0\u042f\0\u042f\0\u042f\0\u3234\0\u12f3\0\u3273\0\u32b2\0\u32f1" +
                    "\0\u3330\0\u336f\0\u33ae\0\u33ed\0\u342c\0\u052b\0\u346b\0\u34aa" +
                    "\0\u34e9\0\u1665\0\u042f\0\u17a0\0\u3528\0\u3567\0\u2a54\0\u35a6" +
                    "\0\u042f\0\u052b\0\u0627\0\u0627\0\u0627\0\u0627\0\u0627\0\u35e5" +
                    "\0\u0627\0\u3624\0\u3663\0\u36a2\0\u042f\0\u36e1\0\u3720\0\u375f" +
                    "\0\u0627\0\u11f7\0\u052b\0\u052b\0\u052b\0\u052b\0\u052b\0\u379e" +
                    "\0\u052b\0\u37dd\0\u381c\0\u385b\0\u389a\0\u38d9\0\u0627\0\u0627" +
                    "\0\u36e1\0\u375f\0\u3918\0\u3957\0\u052b\0\u052b\0\u0627\0\u3996" +
                    "\0\u052b\0\u39d5\0\u3a14\0\u3a53\0\u0627\0\u052b";

    private static int[] zzUnpackRowMap() {
        int[] result = new int[406];
        int offset = 0;
        offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
        return result;
    }

    private static int zzUnpackRowMap(String packed, int offset, int[] result) {
        int i = 0;  /* index in packed string  */
        int j = offset;  /* index in unpacked array */
        int l = packed.length();
        while (i < l) {
            int high = packed.charAt(i++) << 16;
            result[j++] = high | packed.charAt(i++);
        }
        return j;
    }

    /**
     * The transition table of the DFA
     */
    private static final int[] ZZ_TRANS = zzUnpackTrans();

    private static final String ZZ_TRANS_PACKED_0 =
            "\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31" +
                    "\1\32\1\33\1\34\1\35\1\36\1\37\4\36\1\40" +
                    "\3\36\1\41\3\36\1\42\1\36\1\43\1\44\3\35" +
                    "\1\34\1\45\1\25\1\46\1\47\1\35\1\50\1\51" +
                    "\1\52\1\53\1\35\1\54\1\35\1\55\1\56\2\35" +
                    "\1\57\1\35\1\60\1\35\1\61\2\35\1\62\1\63" +
                    "\1\35\1\64\1\65\1\66\1\22\1\23\1\24\1\25" +
                    "\1\26\1\36\1\67\1\70\1\32\1\33\3\36\1\37" +
                    "\4\36\1\71\1\36\1\72\6\36\1\73\1\43\5\36" +
                    "\1\45\1\74\4\36\1\75\1\76\1\53\16\36\1\77" +
                    "\1\100\1\36\1\64\1\65\1\66\1\22\1\23\1\24" +
                    "\1\25\1\26\1\36\1\67\1\70\1\32\1\33\3\36" +
                    "\1\37\4\36\1\101\1\36\1\72\7\36\1\43\5\36" +
                    "\1\45\1\102\4\36\1\51\1\76\1\53\16\36\1\77" +
                    "\1\100\1\36\1\64\1\65\1\66\1\22\1\23\1\24" +
                    "\1\25\1\103\1\22\1\104\1\105\1\32\1\33\1\106" +
                    "\1\107\1\110\1\111\1\112\1\111\1\113\1\114\1\115" +
                    "\1\116\1\117\1\120\1\121\1\122\1\123\1\22\1\124" +
                    "\1\125\1\43\1\126\3\107\1\106\1\127\1\25\4\107" +
                    "\1\51\1\130\1\131\16\107\1\132\1\133\1\107\1\64" +
                    "\1\65\1\66\1\22\1\23\1\24\1\25\1\103\1\22" +
                    "\1\104\1\105\1\32\1\33\1\106\1\107\1\110\1\111" +
                    "\1\112\1\111\1\113\1\114\1\115\1\116\1\117\1\120" +
                    "\1\121\1\122\1\123\1\22\1\134\1\135\1\43\1\126" +
                    "\3\107\1\106\1\127\1\25\4\107\1\51\1\130\1\131" +
                    "\16\107\1\132\1\133\1\107\1\64\1\65\1\66\1\22" +
                    "\1\23\1\24\1\25\1\103\1\22\1\104\1\105\1\32" +
                    "\1\33\1\106\1\111\1\110\1\111\1\112\1\111\1\113" +
                    "\1\114\1\115\1\116\1\117\1\120\1\121\1\122\1\123" +
                    "\2\22\1\136\1\43\1\126\3\111\1\106\1\127\1\25" +
                    "\4\111\1\51\1\137\1\131\16\111\1\132\1\133\1\111" +
                    "\1\64\1\65\1\66\1\22\1\23\1\24\1\25\1\26" +
                    "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36" +
                    "\1\37\4\36\1\40\3\36\1\41\3\36\1\42\1\36" +
                    "\1\140\1\44\3\35\1\34\1\45\1\25\1\46\1\141" +
                    "\1\35\1\142\1\51\1\52\1\53\1\35\1\54\1\35" +
                    "\1\55\1\56\2\35\1\57\1\35\1\60\1\35\1\61" +
                    "\2\35\1\62\1\63\1\35\1\64\1\65\1\66\1\143" +
                    "\1\23\1\24\1\25\1\144\1\145\1\143\1\146\1\32" +
                    "\1\147\3\143\1\150\4\143\1\151\11\143\1\152\5\143" +
                    "\1\153\1\25\3\143\1\154\1\75\1\143\1\53\16\143" +
                    "\1\155\1\156\1\143\1\157\1\160\1\143\1\22\1\23" +
                    "\1\24\1\25\1\26\1\27\1\30\1\70\1\32\1\33" +
                    "\1\34\2\36\1\37\4\36\1\40\3\36\1\41\3\36" +
                    "\1\42\1\36\1\43\1\44\3\36\1\34\1\161\1\25" +
                    "\1\162\1\163\1\36\1\164\1\51\1\52\1\165\1\36" +
                    "\1\166\1\36\1\167\1\170\2\36\1\171\1\36\1\172" +
                    "\1\36\1\173\2\36\1\62\1\63\1\36\1\64\1\65" +
                    "\1\66\2\22\1\0\47\22\1\174\26\22\1\0\4\22" +
                    "\1\175\2\22\1\176\17\22\1\177\2\22\1\200\3\22" +
                    "\1\176\34\22\1\66\1\22\1\23\1\24\1\25\1\201" +
                    "\1\145\1\22\1\31\1\32\1\33\14\202\1\203\2\202" +
                    "\1\22\1\204\1\22\6\202\1\205\1\25\4\202\1\75" +
                    "\1\52\1\53\16\202\1\206\1\207\1\202\1\64\1\65" +
                    "\1\66\4\210\1\211\2\210\1\212\1\213\41\210\1\214" +
                    "\21\210\1\64\2\210\1\22\1\23\1\24\1\25\1\215" +
                    "\1\216\1\217\1\70\1\32\1\33\2\220\1\221\1\222" +
                    "\1\223\1\224\1\225\1\226\1\227\1\230\1\231\1\232" +
                    "\1\233\1\220\2\22\1\234\1\125\1\43\5\220\1\45" +
                    "\1\25\4\220\1\75\1\235\1\53\16\220\1\206\1\207" +
                    "\1\220\1\64\1\236\1\237\1\22\1\23\1\24\1\25" +
                    "\1\26\1\36\1\30\1\31\1\32\1\33\1\34\2\36" +
                    "\1\37\4\36\1\40\3\36\1\41\3\36\1\42\1\36" +
                    "\1\43\1\44\3\36\1\34\1\45\1\25\1\162\1\163" +
                    "\1\36\1\164\1\51\1\52\1\53\1\36\1\166\1\36" +
                    "\1\167\1\170\2\36\1\171\1\36\1\172\1\36\1\173" +
                    "\2\36\1\62\1\63\1\36\1\64\1\65\1\66\13\0" +
                    "\1\240\22\0\3\240\3\0\4\240\3\0\16\240\2\0" +
                    "\1\240\36\0\1\241\144\0\1\24\74\0\1\36\1\242" +
                    "\1\243\74\36\1\244\2\0\1\244\1\245\1\246\1\247" +
                    "\3\244\22\246\1\244\5\246\2\244\4\246\3\244\16\246" +
                    "\2\244\1\246\3\244\4\0\1\250\2\36\3\0\22\36" +
                    "\1\0\5\36\2\0\4\36\3\0\16\36\2\0\1\36" +
                    "\10\0\3\251\1\32\1\252\1\251\1\253\1\0\2\251" +
                    "\1\0\1\251\3\0\1\251\5\0\1\254\2\0\1\251" +
                    "\3\253\1\251\2\0\4\253\3\0\16\253\2\0\1\253" +
                    "\1\0\1\255\1\0\4\252\1\256\4\252\1\257\65\252" +
                    "\4\0\1\250\2\36\3\0\1\34\21\36\1\0\1\34" +
                    "\3\36\1\34\2\0\4\36\3\0\16\36\2\0\1\36" +
                    "\7\0\1\250\2\36\3\0\2\35\12\36\1\260\3\36" +
                    "\1\261\1\36\1\0\5\35\2\0\4\35\1\0\1\262" +
                    "\1\0\16\35\2\0\1\35\7\0\1\250\2\36\3\0" +
                    "\1\263\7\36\1\264\1\36\1\265\7\36\1\0\1\265" +
                    "\3\36\1\263\2\0\4\36\3\0\16\36\1\266\1\0" +
                    "\1\36\7\0\1\250\2\36\3\0\22\36\1\0\5\36" +
                    "\2\0\4\36\1\0\1\267\1\0\16\36\2\0\1\36" +
                    "\7\0\1\250\2\36\3\0\20\36\1\270\1\36\1\0" +
                    "\5\36\1\0\1\271\4\36\3\0\16\36\2\0\1\36" +
                    "\7\0\1\250\2\36\3\0\2\35\12\36\1\260\3\36" +
                    "\1\261\1\36\1\0\5\35\2\0\1\35\1\272\2\35" +
                    "\1\0\1\262\1\0\12\35\1\273\3\35\2\0\1\35" +
                    "\7\0\1\250\2\36\3\0\2\35\12\36\1\260\3\36" +
                    "\1\261\1\36\1\0\5\35\2\0\4\35\1\0\1\262" +
                    "\1\0\1\274\6\35\1\275\6\35\2\0\1\35\7\0" +
                    "\1\250\2\36\3\0\2\35\12\36\1\260\3\36\1\261" +
                    "\1\36\1\0\5\35\2\0\4\35\1\0\1\262\1\0" +
                    "\6\35\1\276\7\35\2\0\1\35\25\0\1\277\25\0" +
                    "\1\300\100\0\1\301\30\0\1\250\2\36\3\0\2\35" +
                    "\12\36\1\260\3\36\1\261\1\36\1\0\5\35\2\0" +
                    "\4\35\1\0\1\262\1\0\2\35\1\302\13\35\2\0" +
                    "\1\35\7\0\1\250\2\36\3\0\2\35\12\36\1\260" +
                    "\3\36\1\261\1\36\1\0\5\35\2\0\3\35\1\303" +
                    "\1\0\1\262\1\0\16\35\2\0\1\35\7\0\1\250" +
                    "\2\36\3\0\2\35\12\36\1\260\3\36\1\261\1\36" +
                    "\1\0\5\35\2\0\4\35\1\0\1\262\1\0\5\35" +
                    "\1\304\10\35\2\0\1\35\7\0\1\250\2\36\3\0" +
                    "\2\35\12\36\1\260\3\36\1\261\1\36\1\0\5\35" +
                    "\2\0\1\35\1\305\2\35\1\0\1\262\1\0\5\35" +
                    "\1\306\3\35\1\307\4\35\2\0\1\35\7\0\1\250" +
                    "\2\36\3\0\2\35\12\36\1\260\3\36\1\261\1\36" +
                    "\1\0\5\35\2\0\4\35\1\0\1\262\1\0\1\310" +
                    "\15\35\2\0\1\35\7\0\1\250\2\36\3\0\2\35" +
                    "\12\36\1\260\3\36\1\261\1\36\1\0\5\35\2\0" +
                    "\4\35\1\0\1\262\1\0\12\35\1\311\3\35\2\0" +
                    "\1\35\25\0\1\312\25\0\1\313\20\0\1\314\27\0" +
                    "\1\315\46\0\1\316\1\317\10\0\1\250\2\36\3\0" +
                    "\22\36\1\0\5\36\2\0\4\36\1\0\1\100\1\0" +
                    "\16\36\2\0\1\36\10\0\3\251\1\32\1\252\1\251" +
                    "\1\253\1\0\2\251\1\0\1\251\3\0\1\251\5\0" +
                    "\1\254\2\0\1\251\3\253\1\251\2\0\4\253\2\0" +
                    "\1\320\16\253\2\0\1\253\1\0\1\255\5\0\1\250" +
                    "\2\36\3\0\22\36\1\0\1\36\1\321\1\36\1\321" +
                    "\1\36\2\0\1\321\2\36\1\322\3\0\1\323\4\321" +
                    "\1\324\1\325\5\321\1\326\1\323\2\0\1\321\36\0" +
                    "\1\327\65\0\1\277\104\0\1\330\20\0\1\331\116\0" +
                    "\1\314\11\0\1\250\2\36\3\0\10\36\1\264\11\36" +
                    "\1\0\5\36\2\0\4\36\3\0\16\36\2\0\1\36" +
                    "\36\0\1\332\43\0\1\111\1\333\1\243\74\111\51\0" +
                    "\1\334\32\0\3\251\1\32\1\252\1\251\1\253\1\0" +
                    "\2\251\1\0\1\251\3\0\1\251\5\0\1\254\2\0" +
                    "\1\251\3\253\1\251\2\0\4\253\2\0\1\335\16\253" +
                    "\2\0\1\253\1\0\1\255\6\0\1\336\4\0\1\106" +
                    "\22\0\1\106\3\0\1\106\41\0\1\337\2\111\3\0" +
                    "\2\107\1\0\3\111\1\0\1\111\4\0\1\340\3\0" +
                    "\1\341\2\0\5\107\2\0\4\107\1\0\1\262\1\0" +
                    "\16\107\2\0\1\107\54\0\1\342\31\0\1\337\2\111" +
                    "\3\0\2\111\1\0\3\111\1\0\1\111\13\0\5\111" +
                    "\2\0\4\111\3\0\16\111\2\0\1\111\23\0\1\343" +
                    "\30\0\1\344\47\0\1\345\125\0\1\346\51\0\1\347" +
                    "\24\0\1\350\53\0\1\351\22\0\1\352\62\0\1\353" +
                    "\1\354\2\0\1\353\77\0\1\355\105\0\1\356\77\0" +
                    "\1\357\75\0\1\360\17\0\1\361\56\0\1\362\20\0" +
                    "\1\363\32\0\1\364\22\0\1\365\47\0\1\366\11\0" +
                    "\1\367\46\0\1\250\2\36\3\0\2\35\12\36\1\260" +
                    "\3\36\1\261\1\36\1\0\5\35\2\0\4\35\1\0" +
                    "\1\262\1\0\1\370\6\35\1\275\6\35\2\0\1\35" +
                    "\7\0\1\250\2\36\3\0\2\35\12\36\1\260\3\36" +
                    "\1\261\1\36\1\0\5\35\2\0\4\35\1\0\1\262" +
                    "\1\0\3\35\1\371\2\35\1\276\7\35\2\0\1\35" +
                    "\3\0\1\143\3\0\4\143\1\0\23\143\1\0\5\143" +
                    "\2\0\4\143\1\0\1\143\1\0\25\143\1\372\1\243" +
                    "\1\0\4\143\1\0\23\143\1\0\5\143\2\0\4\143" +
                    "\1\0\1\143\1\0\24\143\1\244\2\0\3\244\1\373" +
                    "\70\244\1\143\3\0\1\143\3\374\1\32\1\147\1\374" +
                    "\1\375\1\143\2\374\1\143\1\374\3\143\1\374\5\143" +
                    "\1\376\1\143\1\0\1\374\3\375\1\374\2\0\4\375" +
                    "\1\0\1\143\1\0\16\375\2\143\1\375\3\143\1\147" +
                    "\3\252\1\377\3\147\1\252\1\u0100\22\147\1\252\5\147" +
                    "\2\252\4\147\1\252\1\147\1\252\24\147\1\143\3\0" +
                    "\4\143\1\0\23\143\1\0\5\143\2\0\4\143\1\0" +
                    "\1\143\1\0\3\143\1\u0101\21\143\3\0\4\143\1\0" +
                    "\23\143\1\0\5\143\2\0\4\143\1\0\1\143\1\0" +
                    "\16\143\1\u0102\5\143\4\0\1\250\2\36\3\0\22\36" +
                    "\1\0\5\36\2\0\1\36\1\u0103\2\36\3\0\12\36" +
                    "\1\u0104\3\36\2\0\1\36\7\0\1\250\2\36\3\0" +
                    "\22\36\1\0\5\36\2\0\4\36\3\0\1\u0105\6\36" +
                    "\1\u0106\6\36\2\0\1\36\7\0\1\250\2\36\3\0" +
                    "\22\36\1\0\5\36\2\0\4\36\3\0\6\36\1\u0107" +
                    "\7\36\2\0\1\36\7\0\1\250\2\36\3\0\22\36" +
                    "\1\0\5\36\2\0\4\36\3\0\2\36\1\u0108\13\36" +
                    "\2\0\1\36\7\0\1\250\2\36\3\0\22\36\1\0" +
                    "\5\36\2\0\3\36\1\u0109\3\0\16\36\2\0\1\36" +
                    "\7\0\1\250\2\36\3\0\22\36\1\0\5\36\2\0" +
                    "\4\36\3\0\5\36\1\u010a\10\36\2\0\1\36\7\0" +
                    "\1\250\2\36\3\0\22\36\1\0\5\36\2\0\1\36" +
                    "\1\u010b\2\36\3\0\5\36\1\u010c\3\36\1\u010d\4\36" +
                    "\2\0\1\36\7\0\1\250\2\36\3\0\22\36\1\0" +
                    "\5\36\2\0\4\36\3\0\1\u010e\15\36\2\0\1\36" +
                    "\7\0\1\250\2\36\3\0\22\36\1\0\5\36\2\0" +
                    "\4\36\3\0\12\36\1\u010f\3\36\2\0\1\36\100\0" +
                    "\1\255\13\0\1\176\22\0\1\176\3\0\1\176\35\0" +
                    "\1\202\1\u0110\1\243\74\202\4\0\1\u0111\3\202\2\0" +
                    "\17\202\3\0\6\202\2\0\4\202\3\0\16\202\2\0" +
                    "\1\202\7\0\1\u0111\3\202\2\0\17\202\3\0\6\202" +
                    "\2\0\4\202\1\0\1\267\1\0\16\202\2\0\1\202" +
                    "\3\0\1\u0112\1\u0113\1\243\74\u0112\5\0\3\251\2\0" +
                    "\1\251\1\253\1\0\2\251\1\0\1\251\3\0\1\251" +
                    "\10\0\1\251\3\253\1\251\2\0\4\253\2\0\1\u0114" +
                    "\16\253\2\0\1\253\1\0\1\255\1\0\1\220\1\u0115" +
                    "\1\243\74\220\4\0\1\u0116\5\0\2\220\13\0\1\220" +
                    "\5\0\5\220\2\0\4\220\3\0\16\220\2\0\1\220" +
                    "\21\0\1\u0117\5\0\1\u0118\1\0\1\u0119\22\0\1\u011a" +
                    "\42\0\1\u011b\2\0\1\u011b\70\0\2\240\21\0\5\240" +
                    "\2\0\4\240\3\0\16\240\2\0\1\240\3\0\2\u011c" +
                    "\1\0\2\u011c\2\u011d\1\u011e\2\u011c\2\u011f\1\u011c\2\u011f" +
                    "\1\u0120\1\u011f\1\u0120\2\u011c\1\u011f\1\u011c\1\u0120\6\u011c" +
                    "\5\u011f\2\u011c\4\u011f\3\u011c\16\u011f\2\u011c\1\u011f\3\u011c" +
                    "\2\0\1\243\1\0\1\u0121\2\36\3\0\22\36\1\0" +
                    "\5\36\2\0\4\36\3\0\16\36\2\0\1\36\7\0" +
                    "\1\u0122\72\0\1\244\2\0\74\244\1\246\1\36\1\0" +
                    "\74\246\1\244\2\0\1\244\1\245\2\246\3\244\22\246" +
                    "\1\244\5\246\2\244\4\246\3\244\16\246\2\244\1\246" +
                    "\3\244\1\373\1\u0123\1\u0124\1\373\1\u0125\2\247\3\373" +
                    "\22\247\1\373\5\247\2\373\4\247\3\373\16\247\2\373" +
                    "\1\247\3\373\2\36\1\0\74\36\12\0\2\253\21\0" +
                    "\5\253\2\0\4\253\3\0\16\253\2\0\1\253\3\0" +
                    "\4\252\1\256\4\252\1\u0126\65\252\4\0\1\250\2\36" +
                    "\3\0\22\36\1\0\5\36\2\0\4\36\1\0\1\u0127" +
                    "\1\0\16\36\2\0\1\36\7\0\1\u0128\2\36\1\u0129" +
                    "\2\0\1\u012a\1\u012b\1\36\3\u012b\1\u012a\1\u012b\2\36" +
                    "\1\u012a\1\36\1\u012a\5\36\1\0\1\u012a\3\u012b\1\u012a" +
                    "\2\0\4\u012b\3\0\16\u012b\2\0\1\u012b\55\0\1\u012c" +
                    "\30\0\1\250\2\36\3\0\1\263\21\36\1\0\1\263" +
                    "\3\36\1\263\2\0\4\36\3\0\16\36\2\0\1\36" +
                    "\74\0\1\u012d\11\0\1\250\2\36\3\0\22\36\1\0" +
                    "\5\36\1\0\1\u012e\4\36\3\0\16\36\2\0\1\36" +
                    "\36\0\1\u012f\47\0\1\250\2\36\3\0\2\35\12\36" +
                    "\1\260\3\36\1\261\1\36\1\0\5\35\2\0\2\35" +
                    "\1\u0130\1\35\1\0\1\262\1\0\16\35\2\0\1\35" +
                    "\7\0\1\250\2\36\3\0\2\35\12\36\1\260\3\36" +
                    "\1\261\1\36\1\0\5\35\2\0\3\35\1\u0131\1\0" +
                    "\1\262\1\0\16\35\2\0\1\35\7\0\1\250\2\36" +
                    "\3\0\2\35\12\36\1\260\3\36\1\261\1\36\1\0" +
                    "\5\35\2\0\1\35\1\u0132\2\35\1\0\1\262\1\0" +
                    "\3\35\1\u0133\12\35\2\0\1\35\7\0\1\250\2\36" +
                    "\3\0\2\35\12\36\1\260\3\36\1\261\1\36\1\0" +
                    "\5\35\2\0\4\35\1\0\1\262\1\0\3\35\1\u0134" +
                    "\12\35\2\0\1\35\7\0\1\250\2\36\3\0\2\35" +
                    "\12\36\1\260\3\36\1\261\1\36\1\0\5\35\2\0" +
                    "\4\35\1\0\1\262\1\0\6\35\1\u0135\7\35\2\0" +
                    "\1\35\7\0\1\250\2\36\3\0\2\35\12\36\1\260" +
                    "\3\36\1\261\1\36\1\0\5\35\2\0\4\35\1\0" +
                    "\1\262\1\0\1\u0136\15\35\2\0\1\35\7\0\1\250" +
                    "\2\36\3\0\2\35\12\36\1\260\3\36\1\261\1\36" +
                    "\1\0\5\35\2\0\4\35\1\0\1\262\1\0\10\35" +
                    "\1\u0137\5\35\2\0\1\35\7\0\1\250\2\36\3\0" +
                    "\2\35\12\36\1\260\3\36\1\261\1\36\1\0\5\35" +
                    "\2\0\4\35\1\0\1\262\1\0\1\u0138\15\35\2\0" +
                    "\1\35\7\0\1\250\2\36\3\0\2\35\12\36\1\260" +
                    "\3\36\1\261\1\36\1\0\5\35\2\0\1\u0139\3\35" +
                    "\1\0\1\262\1\0\16\35\2\0\1\35\7\0\1\250" +
                    "\2\36\3\0\2\35\12\36\1\260\3\36\1\261\1\36" +
                    "\1\0\5\35\2\0\1\35\1\u013a\2\35\1\0\1\262" +
                    "\1\0\16\35\2\0\1\35\6\0\1\u013b\1\u013c\6\0" +
                    "\1\u013d\1\0\3\u013d\1\0\1\u013d\14\0\3\u013d\2\0" +
                    "\1\u013b\4\u013d\3\0\16\u013d\2\0\1\u013d\6\0\1\u013e" +
                    "\1\u013f\6\0\1\u0140\1\0\3\u0140\1\0\1\u0140\14\0" +
                    "\3\u0140\2\0\1\u013e\4\u0140\3\0\16\u0140\2\0\1\u0140" +
                    "\27\0\1\u0141\45\0\1\u0142\4\0\52\u0143\1\0\24\u0143" +
                    "\4\0\1\250\2\36\3\0\22\36\1\0\5\36\2\0" +
                    "\4\36\3\0\7\36\1\321\4\36\1\321\1\36\2\0" +
                    "\1\36\7\0\1\250\2\36\3\0\22\36\1\0\5\36" +
                    "\2\0\1\321\2\36\1\321\3\0\16\36\2\0\1\36" +
                    "\7\0\1\250\2\36\3\0\22\36\1\0\5\36\2\0" +
                    "\1\321\3\36\3\0\16\36\2\0\1\36\7\0\1\250" +
                    "\2\36\3\0\22\36\1\0\5\36\2\0\4\36\3\0" +
                    "\14\36\1\321\1\36\2\0\1\36\36\0\1\u0144\45\0" +
                    "\1\243\1\0\1\u0145\2\111\3\0\2\111\1\0\3\111" +
                    "\1\0\1\111\13\0\5\111\2\0\4\111\3\0\16\111" +
                    "\2\0\1\111\3\0\52\u0143\1\u0146\24\u0143\12\0\2\u0147" +
                    "\1\0\1\u0147\17\0\5\u0147\2\0\4\u0147\3\0\16\u0147" +
                    "\2\0\1\u0147\3\0\2\111\1\0\74\111\51\0\1\u0127" +
                    "\31\0\1\u0148\2\0\1\u0129\2\0\1\u0149\1\u014a\1\0" +
                    "\3\u014a\1\u0149\1\u014a\2\0\1\u0149\1\0\1\u0149\6\0" +
                    "\1\u0149\3\u014a\1\u0149\2\0\4\u014a\3\0\16\u014a\2\0" +
                    "\1\u014a\6\0\1\u014b\6\0\1\u014c\11\0\1\u014d\10\0" +
                    "\1\u014e\3\0\1\u014c\1\0\1\u014b\70\0\1\353\3\0" +
                    "\1\353\47\0\1\u014f\22\0\1\u014f\1\0\3\u014f\5\0" +
                    "\1\u014f\4\0\2\u014f\1\0\1\u014f\2\0\1\u014f\65\0" +
                    "\1\u0150\76\0\1\u0151\76\0\1\365\77\0\1\u0152\46\0" +
                    "\1\u0153\60\0\1\250\2\36\3\0\2\35\12\36\1\260" +
                    "\3\36\1\261\1\36\1\0\5\35\2\0\4\35\1\0" +
                    "\1\262\1\0\2\35\1\u0154\13\35\2\0\1\35\5\0" +
                    "\1\243\1\0\1\u0122\72\0\1\373\1\u0123\1\u0124\74\373" +
                    "\1\143\3\0\4\143\1\0\1\143\2\375\20\143\1\0" +
                    "\5\375\2\0\4\375\1\0\1\143\1\0\16\375\2\143" +
                    "\1\375\3\143\1\147\3\252\1\377\3\147\1\252\1\u0155" +
                    "\22\147\1\252\5\147\2\252\4\147\1\252\1\147\1\252" +
                    "\24\147\1\143\3\0\4\143\1\0\23\143\1\0\5\143" +
                    "\2\0\4\143\1\0\1\143\1\0\2\143\1\u0156\21\143" +
                    "\4\0\1\250\2\36\3\0\22\36\1\0\5\36\2\0" +
                    "\2\36\1\u0157\1\36\3\0\16\36\2\0\1\36\7\0" +
                    "\1\250\2\36\3\0\22\36\1\0\5\36\2\0\3\36" +
                    "\1\u0158\3\0\16\36\2\0\1\36\7\0\1\250\2\36" +
                    "\3\0\22\36\1\0\5\36\2\0\1\36\1\u0159\2\36" +
                    "\3\0\3\36\1\u015a\12\36\2\0\1\36\7\0\1\250" +
                    "\2\36\3\0\22\36\1\0\5\36\2\0\4\36\3\0" +
                    "\3\36\1\u015b\12\36\2\0\1\36\7\0\1\250\2\36" +
                    "\3\0\22\36\1\0\5\36\2\0\4\36\3\0\6\36" +
                    "\1\u015c\7\36\2\0\1\36\7\0\1\250\2\36\3\0" +
                    "\22\36\1\0\5\36\2\0\4\36\3\0\1\u015d\15\36" +
                    "\2\0\1\36\7\0\1\250\2\36\3\0\22\36\1\0" +
                    "\5\36\2\0\4\36\3\0\10\36\1\u015e\5\36\2\0" +
                    "\1\36\7\0\1\250\2\36\3\0\22\36\1\0\5\36" +
                    "\2\0\4\36\3\0\1\u015f\15\36\2\0\1\36\7\0" +
                    "\1\250\2\36\3\0\22\36\1\0\5\36\2\0\1\u0160" +
                    "\3\36\3\0\16\36\2\0\1\36\7\0\1\250\2\36" +
                    "\3\0\22\36\1\0\5\36\2\0\1\36\1\u0161\2\36" +
                    "\3\0\16\36\2\0\1\36\5\0\1\243\1\0\1\u0162" +
                    "\3\202\2\0\17\202\3\0\6\202\2\0\4\202\3\0" +
                    "\16\202\2\0\1\202\3\0\2\202\1\0\74\202\52\0" +
                    "\1\u0163\26\0\1\243\1\0\1\u0164\5\0\2\220\13\0" +
                    "\1\220\5\0\5\220\2\0\4\220\3\0\16\220\2\0" +
                    "\1\220\3\0\2\220\1\0\74\220\4\0\1\u0165\72\0" +
                    "\2\u011c\1\0\1\u011c\1\u0120\2\u0166\1\u0120\2\u011c\1\u0166" +
                    "\1\u0120\1\u011c\3\u0120\1\u011c\1\u0120\13\u011c\1\u0166\3\u0120" +
                    "\1\u0166\2\u011c\4\u0120\3\u011c\16\u0120\2\u011c\1\u0120\3\u011c" +
                    "\4\0\1\u0165\2\0\1\u0165\67\0\2\u011c\1\0\1\u011c" +
                    "\1\u0120\2\u011d\1\u011f\2\u011c\2\u011f\1\u011c\2\u011f\1\u0120" +
                    "\1\u011f\1\u0120\2\u011c\1\u011f\1\u011c\1\u0120\3\u011c\1\u0167" +
                    "\2\u011c\5\u011f\2\u011c\4\u011f\3\u011c\16\u011f\2\u011c\1\u011f" +
                    "\5\u011c\1\0\1\u011c\1\u0120\2\u011d\1\u011e\2\u011c\2\u011f" +
                    "\1\u011c\2\u011f\1\u0120\1\u011f\1\u0120\2\u011c\1\u011f\1\u011c" +
                    "\1\u0120\3\u011c\1\u0167\2\u011c\5\u011f\2\u011c\4\u011f\3\u011c" +
                    "\16\u011f\2\u011c\1\u011f\3\u011c\1\0\1\372\1\243\76\0" +
                    "\1\u0124\74\0\1\247\1\u0168\1\u0124\74\247\52\0\1\u0169" +
                    "\24\0\2\u012b\1\0\74\u012b\5\0\3\u0149\2\0\2\u0149" +
                    "\1\0\2\u0149\1\0\1\u0149\3\0\1\u0149\10\0\5\u0149" +
                    "\2\0\4\u0149\3\0\16\u0149\2\0\1\u0149\7\0\1\u0128" +
                    "\2\36\1\u0129\2\0\1\u012a\1\u012b\1\36\3\u012b\1\u012a" +
                    "\1\u012b\2\36\1\u012a\1\36\1\u012a\4\36\1\u016a\1\0" +
                    "\1\u012a\3\u012b\1\u012a\2\0\4\u012b\3\0\16\u012b\2\0" +
                    "\1\u012b\7\0\1\u0128\2\u012b\1\u0129\2\0\2\u012b\1\36" +
                    "\3\u012b\1\u012a\1\u012b\2\36\1\u012a\1\36\1\u012a\4\36" +
                    "\1\u016a\1\0\5\u012b\2\0\4\u012b\3\0\16\u012b\2\0" +
                    "\1\u012b\7\0\1\250\2\36\3\0\2\35\12\36\1\260" +
                    "\3\36\1\261\1\36\1\0\5\35\2\0\3\35\1\u016b" +
                    "\1\0\1\262\1\0\16\35\2\0\1\35\7\0\1\250" +
                    "\2\36\3\0\2\35\12\36\1\260\3\36\1\261\1\36" +
                    "\1\0\5\35\2\0\4\35\1\0\1\262\1\0\1\u016c" +
                    "\15\35\2\0\1\35\7\0\1\250\2\36\3\0\2\35" +
                    "\12\36\1\260\3\36\1\261\1\36\1\0\5\35\2\0" +
                    "\4\35\1\0\1\262\1\0\7\35\1\u016d\6\35\2\0" +
                    "\1\35\7\0\1\250\2\36\3\0\2\35\12\36\1\260" +
                    "\3\36\1\261\1\36\1\0\5\35\2\0\3\35\1\u016e" +
                    "\1\0\1\262\1\0\16\35\2\0\1\35\7\0\1\250" +
                    "\2\36\3\0\2\35\12\36\1\260\3\36\1\261\1\36" +
                    "\1\0\5\35\2\0\3\35\1\u016f\1\0\1\262\1\0" +
                    "\16\35\2\0\1\35\7\0\1\250\2\36\3\0\2\35" +
                    "\12\36\1\260\3\36\1\261\1\36\1\0\5\35\2\0" +
                    "\3\35\1\u0170\1\0\1\262\1\0\16\35\2\0\1\35" +
                    "\7\0\1\250\2\36\3\0\2\35\12\36\1\260\3\36" +
                    "\1\261\1\36\1\0\5\35\2\0\3\35\1\u0171\1\0" +
                    "\1\262\1\0\16\35\2\0\1\35\7\0\1\250\2\36" +
                    "\3\0\2\35\12\36\1\260\3\36\1\261\1\36\1\0" +
                    "\5\35\2\0\4\35\1\0\1\262\1\0\1\35\1\u0172" +
                    "\14\35\2\0\1\35\7\0\1\250\2\36\3\0\2\35" +
                    "\12\36\1\260\3\36\1\261\1\36\1\0\5\35\2\0" +
                    "\1\35\1\u0173\2\35\1\0\1\262\1\0\16\35\2\0" +
                    "\1\35\7\0\1\250\2\36\3\0\2\35\12\36\1\260" +
                    "\3\36\1\261\1\36\1\0\5\35\2\0\4\35\1\0" +
                    "\1\262\1\0\6\35\1\u0174\7\35\2\0\1\35\3\0" +
                    "\2\u013d\1\0\74\u013d\4\0\1\u013c\2\u013d\3\0\2\u013d" +
                    "\1\0\3\u013d\1\0\1\u013d\13\0\5\u013d\2\0\4\u013d" +
                    "\3\0\16\u013d\2\0\1\u013d\3\0\2\u0140\1\0\74\u0140" +
                    "\4\0\1\u013f\2\u0140\3\0\2\u0140\1\0\3\u0140\1\0" +
                    "\1\u0140\13\0\5\u0140\2\0\4\u0140\3\0\16\u0140\2\0" +
                    "\1\u0140\3\0\2\u014a\1\0\74\u014a\4\0\1\u0148\2\0" +
                    "\1\u0129\2\0\1\u0149\1\u014a\1\0\3\u014a\1\u0149\1\u014a" +
                    "\2\0\1\u0149\1\0\1\u0149\4\0\1\u0175\1\0\1\u0149" +
                    "\3\u014a\1\u0149\2\0\4\u014a\3\0\16\u014a\2\0\1\u014a" +
                    "\7\0\1\u0148\2\u014a\1\u0129\2\0\2\u014a\1\0\3\u014a" +
                    "\1\u0149\1\u014a\2\0\1\u0149\1\0\1\u0149\4\0\1\u0175" +
                    "\1\0\5\u014a\2\0\4\u014a\3\0\16\u014a\2\0\1\u014a" +
                    "\10\0\1\u0176\4\0\1\u014c\22\0\1\u014c\3\0\1\u014c" +
                    "\72\0\1\u0177\1\u0178\2\0\1\u0177\41\0\1\250\2\36" +
                    "\3\0\2\35\12\36\1\260\3\36\1\261\1\36\1\0" +
                    "\5\35\2\0\4\35\1\0\1\262\1\0\1\35\1\u0179" +
                    "\14\35\2\0\1\35\3\0\1\143\3\0\4\143\1\0" +
                    "\23\143\1\0\5\143\2\0\4\143\1\0\1\143\1\0" +
                    "\1\143\1\u017a\22\143\4\0\1\250\2\36\3\0\22\36" +
                    "\1\0\5\36\2\0\3\36\1\u017b\3\0\16\36\2\0" +
                    "\1\36\7\0\1\250\2\36\3\0\22\36\1\0\5\36" +
                    "\2\0\4\36\3\0\1\u017c\15\36\2\0\1\36\7\0" +
                    "\1\250\2\36\3\0\22\36\1\0\5\36\2\0\4\36" +
                    "\3\0\7\36\1\u017d\6\36\2\0\1\36\7\0\1\250" +
                    "\2\36\3\0\22\36\1\0\5\36\2\0\3\36\1\u017e" +
                    "\3\0\16\36\2\0\1\36\7\0\1\250\2\36\3\0" +
                    "\22\36\1\0\5\36\2\0\3\36\1\u017f\3\0\16\36" +
                    "\2\0\1\36\7\0\1\250\2\36\3\0\22\36\1\0" +
                    "\5\36\2\0\3\36\1\u0180\3\0\16\36\2\0\1\36" +
                    "\7\0\1\250\2\36\3\0\22\36\1\0\5\36\2\0" +
                    "\3\36\1\u0181\3\0\16\36\2\0\1\36\7\0\1\250" +
                    "\2\36\3\0\22\36\1\0\5\36\2\0\4\36\3\0" +
                    "\1\36\1\u0182\14\36\2\0\1\36\7\0\1\250\2\36" +
                    "\3\0\22\36\1\0\5\36\2\0\1\36\1\u0183\2\36" +
                    "\3\0\16\36\2\0\1\36\7\0\1\250\2\36\3\0" +
                    "\22\36\1\0\5\36\2\0\4\36\3\0\6\36\1\u0184" +
                    "\7\36\2\0\1\36\3\0\2\u011c\1\0\2\u011c\2\u011d" +
                    "\1\u011e\2\u011c\2\u011f\1\u011c\2\u011f\1\u0120\1\u011f\1\u0120" +
                    "\2\u011c\1\u011f\1\u011c\1\u0120\3\u011c\1\u0167\2\u011c\5\u011f" +
                    "\2\u011c\4\u011f\3\u011c\16\u011f\2\u011c\1\u011f\5\u011c\1\0" +
                    "\1\u011c\1\u0120\2\u0166\3\u011c\1\u0166\1\u0120\1\u011c\3\u0120" +
                    "\1\u011c\1\u0120\13\u011c\1\u0166\3\u0120\1\u0166\2\u011c\4\u0120" +
                    "\3\u011c\16\u0120\2\u011c\1\u0120\3\u011c\2\0\1\u0124\1\0" +
                    "\1\250\2\36\3\0\22\36\1\0\5\36\2\0\4\36" +
                    "\3\0\16\36\2\0\1\36\7\0\1\250\2\36\3\0" +
                    "\2\35\12\36\1\260\3\36\1\261\1\36\1\0\5\35" +
                    "\2\0\4\35\1\0\1\262\1\0\1\35\1\u0185\14\35" +
                    "\2\0\1\35\7\0\1\250\2\36\3\0\2\35\12\36" +
                    "\1\260\3\36\1\261\1\36\1\0\5\35\2\0\1\u0186" +
                    "\3\35\1\0\1\262\1\0\16\35\2\0\1\35\7\0" +
                    "\1\250\2\36\3\0\2\35\12\36\1\260\3\36\1\261" +
                    "\1\36\1\0\5\35\2\0\4\35\1\0\1\262\1\0" +
                    "\6\35\1\u0187\7\35\2\0\1\35\7\0\1\250\2\36" +
                    "\3\0\2\35\12\36\1\260\3\36\1\261\1\36\1\0" +
                    "\5\35\2\0\3\35\1\u0188\1\0\1\262\1\0\16\35" +
                    "\2\0\1\35\15\0\2\u0189\1\0\1\u0189\17\0\5\u0189" +
                    "\2\0\4\u0189\3\0\16\u0189\2\0\1\u0189\40\0\1\u0177" +
                    "\3\0\1\u0177\47\0\1\u018a\22\0\1\u018a\1\0\3\u018a" +
                    "\5\0\1\u018a\4\0\2\u018a\1\0\1\u018a\2\0\1\u018a" +
                    "\20\0\1\250\2\36\3\0\22\36\1\0\5\36\2\0" +
                    "\4\36\3\0\1\36\1\u018b\14\36\2\0\1\36\7\0" +
                    "\1\250\2\36\3\0\22\36\1\0\5\36\2\0\1\u018c" +
                    "\3\36\3\0\16\36\2\0\1\36\7\0\1\250\2\36" +
                    "\3\0\22\36\1\0\5\36\2\0\4\36\3\0\6\36" +
                    "\1\u018d\7\36\2\0\1\36\7\0\1\250\2\36\3\0" +
                    "\22\36\1\0\5\36\2\0\3\36\1\u018e\3\0\16\36" +
                    "\2\0\1\36\7\0\1\250\2\36\3\0\2\35\12\36" +
                    "\1\260\3\36\1\261\1\36\1\0\5\35\2\0\1\u018f" +
                    "\3\35\1\0\1\262\1\0\16\35\2\0\1\35\7\0" +
                    "\1\250\2\36\3\0\2\35\12\36\1\260\3\36\1\261" +
                    "\1\36\1\0\5\35\2\0\1\35\1\u0190\2\35\1\0" +
                    "\1\262\1\0\16\35\2\0\1\35\7\0\1\250\2\36" +
                    "\3\0\22\36\1\0\5\36\2\0\1\u0191\3\36\3\0" +
                    "\16\36\2\0\1\36\7\0\1\250\2\36\3\0\22\36" +
                    "\1\0\5\36\2\0\1\36\1\u0192\2\36\3\0\16\36" +
                    "\2\0\1\36\7\0\1\250\2\36\3\0\2\35\12\36" +
                    "\1\260\3\36\1\261\1\36\1\0\5\35\2\0\4\35" +
                    "\1\0\1\262\1\0\5\35\1\u0193\10\35\2\0\1\35" +
                    "\7\0\1\250\2\36\3\0\22\36\1\0\5\36\2\0" +
                    "\4\36\3\0\5\36\1\u0194\10\36\2\0\1\36\7\0" +
                    "\1\250\2\36\3\0\2\35\12\36\1\260\3\36\1\261" +
                    "\1\36\1\0\5\35\2\0\4\35\1\0\1\262\1\0" +
                    "\1\u0195\15\35\2\0\1\35\7\0\1\250\2\36\3\0" +
                    "\22\36\1\0\5\36\2\0\4\36\3\0\1\u0196\15\36" +
                    "\2\0\1\36\3\0";

    private static int[] zzUnpackTrans() {
        int[] result = new int[14994];
        int offset = 0;
        offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
        return result;
    }

    private static int zzUnpackTrans(String packed, int offset, int[] result) {
        int i = 0;       /* index in packed string  */
        int j = offset;  /* index in unpacked array */
        int l = packed.length();
        while (i < l) {
            int count = packed.charAt(i++);
            int value = packed.charAt(i++);
            value--;
            do result[j++] = value; while (--count > 0);
        }
        return j;
    }


    /* error codes */
    private static final int ZZ_UNKNOWN_ERROR = 0;
    private static final int ZZ_NO_MATCH = 1;
    private static final int ZZ_PUSHBACK_2BIG = 2;
    private static final char[] EMPTY_BUFFER = new char[0];
    private static final int YYEOF = -1;
    private static java.io.Reader zzReader = null; // Fake

    /* error messages for the codes above */
    private static final String ZZ_ERROR_MSG[] = {
            "Unkown internal scanner error",
            "Error: could not match input",
            "Error: pushback value was too large"
    };

    /**
     * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
     */
    private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();

    private static final String ZZ_ATTRIBUTE_PACKED_0 =
            "\21\0\1\11\1\1\2\11\4\1\1\11\10\1\1\11" +
                    "\1\1\1\11\4\1\1\11\11\1\3\11\11\1\1\11" +
                    "\17\1\1\11\1\1\4\11\6\1\2\11\15\1\1\11" +
                    "\5\1\1\11\12\1\1\11\2\1\2\11\3\1\2\11" +
                    "\1\1\2\11\2\1\2\11\1\1\2\11\1\1\5\11" +
                    "\1\1\5\11\1\1\3\11\1\1\1\0\6\1\1\0" +
                    "\1\11\1\0\1\1\2\11\1\0\1\11\7\1\1\11" +
                    "\7\1\3\11\10\1\1\0\2\11\1\0\1\11\1\1" +
                    "\1\0\6\1\3\11\1\0\1\1\1\11\5\0\5\11" +
                    "\1\1\3\11\1\1\1\0\4\11\1\1\1\11\1\1" +
                    "\2\0\1\11\32\1\1\0\1\11\3\1\1\0\5\11" +
                    "\7\0\1\1\1\11\3\1\2\0\2\1\4\11\13\1" +
                    "\1\11\1\0\1\1\1\11\1\0\1\1\4\11\1\0" +
                    "\1\11\1\1\4\0\1\1\1\11\2\1\4\11\16\1" +
                    "\1\0\1\11\3\0\2\1\1\11\13\1\1\11\1\0" +
                    "\1\1\1\0\36\1";

    private static int[] zzUnpackAttribute() {
        int[] result = new int[406];
        int offset = 0;
        offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
        return result;
    }

    private static int zzUnpackAttribute(String packed, int offset, int[] result) {
        int i = 0;       /* index in packed string  */
        int j = offset;  /* index in unpacked array */
        int l = packed.length();
        while (i < l) {
            int count = packed.charAt(i++);
            int value = packed.charAt(i++);
            do result[j++] = value; while (--count > 0);
        }
        return j;
    }

    /**
     * the current state of the DFA
     */
    private int zzState;

    /**
     * the current lexical state
     */
    private int zzLexicalState = YYINITIAL;

    /**
     * this buffer contains the current text to be matched and is
     * the source of the yytext() string
     */
    private CharSequence zzBuffer = "";

    /**
     * this buffer may contains the current text array to be matched when it is cheap to acquire it
     */
    private char[] zzBufferArray;

    /**
     * the textposition at the last accepting state
     */
    private int zzMarkedPos;

    /**
     * the textposition at the last state to be included in yytext
     */
    private int zzPushbackPos;

    /**
     * the current text position in the buffer
     */
    private int zzCurrentPos;

    /**
     * startRead marks the beginning of the yytext() string in the buffer
     */
    private int zzStartRead;

    /**
     * endRead marks the last character in the buffer, that has been read
     * from input
     */
    private int zzEndRead;

    /**
     * zzAtBOL == true <=> the scanner is currently at the beginning of a line
     */
    private boolean zzAtBOL = true;

    /**
     * zzAtEOF == true <=> the scanner is at the EOF
     */
    private boolean zzAtEOF;

    /**
     * For the backwards DFA of general lookahead statements
     */
    private boolean[] zzFin = new boolean[ZZ_BUFFERSIZE + 1];

    /* user code: */
    private Stack<Integer> lastStates = new Stack<Integer>(25);
    private int openParenths = 0;
    private boolean isBash4 = false;

    public _BashLexer(com.ansorgit.plugins.bash.lang.BashVersion version, java.io.Reader in) {
        this(in);
        this.isBash4 = com.ansorgit.plugins.bash.lang.BashVersion.Bash_v4.equals(version);
    }

    /**
     * Goes to the given state and stores the previous state on the stack of states.
     * This makes it possible to have several levels of lexing, e.g. for $(( 1+ $(echo 3) )).
     */
    private void goToState(Integer newState) {
        lastStates.push(yystate());
        yybegin(newState);
    }

    /**
     * Goes back to the previous state of the lexer. If there
     * is no previous state then YYINITIAL, the initial state, is chosen.
     */
    private void backToPreviousState() {
        if (lastStates.isEmpty()) {
            throw new IllegalStateException("BashLexer: Tried to go to previous state, but not more state left.");
        } else {
            yybegin(lastStates.pop());
        }
    }

    //True if the parser is in the case body. Necessary for proper lexing of the IN keyword
    private boolean inCaseBody = false;

    //True if an arithmetic expression is expected as next token (e.g. in $((a-$((1+34)))) ) we need to
    //discern between a simple ( and the start of a new subexpression
    private boolean expectArithExpression = false;

    private boolean startNewArithExpression = false;

    //Help data to parse (nested) strings.
    private final StringParsingState string = new StringParsingState();

    //helper
    long yychar = 0;

    //parameter expansion parsing state
    boolean paramExpansionHash = false;
    boolean paramExpansionWord = false;
    boolean paramExpansionOther = false;

    //conditional expressions
    private boolean emptyConditionalCommand = false;


    public _BashLexer(java.io.Reader in) {
        this.zzReader = in;
    }

    /**
     * Creates a new scanner.
     * There is also java.io.Reader version of this constructor.
     *
     * @param in the java.io.Inputstream to read input from.
     */
    public _BashLexer(java.io.InputStream in) {
        this(new java.io.InputStreamReader(in));
    }

    /**
     * Unpacks the compressed character translation table.
     *
     * @param packed the packed character translation table
     * @return the unpacked character translation table
     */
    private static char[] zzUnpackCMap(String packed) {
        char[] map = new char[0x10000];
        int i = 0;  /* index in packed string  */
        int j = 0;  /* index in unpacked array */
        while (i < 164) {
            int count = packed.charAt(i++);
            char value = packed.charAt(i++);
            do map[j++] = value; while (--count > 0);
        }
        return map;
    }

    public final int getTokenStart() {
        return zzStartRead;
    }

    public final int getTokenEnd() {
        return getTokenStart() + yylength();
    }

    public void reset(CharSequence buffer, int start, int end, int initialState) {
        zzBuffer = buffer;
        zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer);
        zzCurrentPos = zzMarkedPos = zzStartRead = start;
        zzPushbackPos = 0;
        zzAtEOF = false;
        zzAtBOL = true;
        zzEndRead = end;
        yybegin(initialState);
    }

    /**
     * Refills the input buffer.
     *
     * @return <code>false</code>, iff there was new input.
     * @throws java.io.IOException if any I/O-Error occurs
     */
    private boolean zzRefill() throws java.io.IOException {
        return true;
    }


    /**
     * Returns the current lexical state.
     */
    public final int yystate() {
        return zzLexicalState;
    }


    /**
     * Enters a new lexical state
     *
     * @param newState the new lexical state
     */
    public final void yybegin(int newState) {
        zzLexicalState = newState;
    }


    /**
     * Returns the text matched by the current regular expression.
     */
    public final CharSequence yytext() {
        return zzBuffer.subSequence(zzStartRead, zzMarkedPos);
    }


    /**
     * Returns the character at position <tt>pos</tt> from the
     * matched text.
     * <p/>
     * It is equivalent to yytext().charAt(pos), but faster
     *
     * @param pos the position of the character to fetch.
     *            A value from 0 to yylength()-1.
     * @return the character at position pos
     */
    public final char yycharat(int pos) {
        return zzBufferArray != null ? zzBufferArray[zzStartRead + pos] : zzBuffer.charAt(zzStartRead + pos);
    }


    /**
     * Returns the length of the matched text region.
     */
    public final int yylength() {
        return zzMarkedPos - zzStartRead;
    }


    /**
     * Reports an error that occured while scanning.
     * <p/>
     * In a wellformed scanner (no or only correct usage of
     * yypushback(int) and a match-all fallback rule) this method
     * will only be called with things that "Can't Possibly Happen".
     * If this method is called, something is seriously wrong
     * (e.g. a JFlex bug producing a faulty scanner etc.).
     * <p/>
     * Usual syntax/scanner level error handling should be done
     * in error fallback rules.
     *
     * @param errorCode the code of the errormessage to display
     */
    private void zzScanError(int errorCode) {
        String message;
        try {
            message = ZZ_ERROR_MSG[errorCode];
        } catch (ArrayIndexOutOfBoundsException e) {
            message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
        }

        throw new Error(message);
    }


    /**
     * Pushes the specified amount of characters back into the input stream.
     * <p/>
     * They will be read again by then next call of the scanning method
     *
     * @param number the number of characters to be read again.
     *               This number must not be greater than yylength()!
     */
    public void yypushback(int number) {
        if (number > yylength())
            zzScanError(ZZ_PUSHBACK_2BIG);

        zzMarkedPos -= number;
    }


    /**
     * Resumes scanning until the next regular expression is matched,
     * the end of input is encountered or an I/O-Error occurs.
     *
     * @return the next token
     * @throws java.io.IOException if any I/O-Error occurs
     */
    public IElementType advance() throws java.io.IOException {
        int zzInput;
        int zzAction;

        // cached fields:
        int zzCurrentPosL;
        int zzMarkedPosL;
        int zzEndReadL = zzEndRead;
        CharSequence zzBufferL = zzBuffer;
        char[] zzBufferArrayL = zzBufferArray;
        char[] zzCMapL = ZZ_CMAP;

        int[] zzTransL = ZZ_TRANS;
        int[] zzRowMapL = ZZ_ROWMAP;
        int[] zzAttrL = ZZ_ATTRIBUTE;

        while (true) {
            zzMarkedPosL = zzMarkedPos;

            yychar += zzMarkedPosL - zzStartRead;

            zzAction = -1;

            zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;

            zzState = ZZ_LEXSTATE[zzLexicalState];


            zzForAction:
            {
                while (true) {

                    if (zzCurrentPosL < zzEndReadL)
                        zzInput = zzBufferL.charAt(zzCurrentPosL++);
                    else if (zzAtEOF) {
                        zzInput = YYEOF;
                        break zzForAction;
                    } else {
                        // store back cached positions
                        zzCurrentPos = zzCurrentPosL;
                        zzMarkedPos = zzMarkedPosL;
                        boolean eof = zzRefill();
                        // get translated positions and possibly new buffer
                        zzCurrentPosL = zzCurrentPos;
                        zzMarkedPosL = zzMarkedPos;
                        zzBufferL = zzBuffer;
                        zzEndReadL = zzEndRead;
                        if (eof) {
                            zzInput = YYEOF;
                            break zzForAction;
                        } else {
                            zzInput = zzBufferL.charAt(zzCurrentPosL++);
                        }
                    }
                    int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
                    if (zzNext == -1) break zzForAction;
                    zzState = zzNext;

                    int zzAttributes = zzAttrL[zzState];
                    if ((zzAttributes & 1) == 1) {
                        zzAction = zzState;
                        zzMarkedPosL = zzCurrentPosL;
                        if ((zzAttributes & 8) == 8) break zzForAction;
                    }

                }
            }

            // store back cached position
            zzMarkedPos = zzMarkedPosL;

            switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
                case 58: {
                    paramExpansionHash = paramExpansionWord && true;
                    return PARAM_EXPANSION_OP_HASH;
                }
                case 162:
                    break;
                case 135: {
                    return REDIRECT_LESS_LESS_MINUS;
                }
                case 163:
                    break;
                case 67: {
                    paramExpansionOther = true;
                    return PARAM_EXPANSION_OP_PERCENT;
                }
                case 164:
                    break;
                case 105: {
                    return ARITH_ASS_MOD;
                }
                case 165:
                    break;
                case 36: {
                    return ARITH_PLUS;
                }
                case 166:
                    break;
                case 65: {
                    return PARAM_EXPANSION_OP_STAR;
                }
                case 167:
                    break;
                case 64: {
                    paramExpansionOther = true;
                    return PARAM_EXPANSION_OP_DOT;
                }
                case 168:
                    break;
                case 54: {
                    backToPreviousState();
                    return RIGHT_PAREN;
                }
                case 169:
                    break;
                case 91: {
                    goToState(S_ARITH);
                    return EXPR_ARITH;
                }
                case 170:
                    break;
                case 151: {
                    return THEN_KEYWORD;
                }
                case 171:
                    break;
                case 33: {
                    return ARITH_MOD;
                }
                case 172:
                    break;
                case 13: {
                    return SEMI;
                }
                case 173:
                    break;
                case 106: {
                    return ARITH_MINUS_MINUS;
                }
                case 174:
                    break;
                case 145:
                    // lookahead expression with fixed base length
                    zzMarkedPos = zzStartRead + 1;
                {
                    backToPreviousState();
                    goToState(S_ASSIGNMENT_LIST);
                    return RIGHT_SQUARE;
                }
                case 175:
                    break;
                case 109: {
                    return ARITH_ASS_PLUS;
                }
                case 176:
                    break;
                case 41: {
                    openParenths--;
                    return RIGHT_PAREN;
                }
                case 177:
                    break;
                case 81:
                    // lookahead expression with fixed lookahead length
                    yypushback(1);
                {
                    return ASSIGNMENT_WORD;
                }
                case 178:
                    break;
                case 127:
                    // lookahead expression with fixed lookahead length
                    yypushback(2);
                {
                    return ASSIGNMENT_WORD;
                }
                case 179:
                    break;
                case 84: {
                    if (isBash4) {
                        return REDIRECT_AMP_GREATER;
                    } else {
                        yypushback(1);
                        return AMP;
                    }
                }
                case 180:
                    break;
                case 66: {
                    return PARAM_EXPANSION_OP_COLON;
                }
                case 181:
                    break;
                case 97: {
                    return REDIRECT_LESS_LESS;
                }
                case 182:
                    break;
                case 154: {
                    inCaseBody = false;
                    goToState(S_CASE);
                    return CASE_KEYWORD;
                }
                case 183:
                    break;
                case 96: {
                    return REDIRECT_LESS_GREATER;
                }
                case 184:
                    break;
                case 150: {
                    return TIME_KEYWORD;
                }
                case 185:
                    break;
                case 55: {
                    string.advanceToken();
                    return STRING_CHAR;
                }
                case 186:
                    break;
                case 19: {
                    return LESS_THAN;
                }
                case 187:
                    break;
                case 149:
                    // general lookahead, find correct zzMarkedPos
                {
                    int zzFState = 15;
                    int zzFPos = zzStartRead;
                    if (zzFin.length <= zzBufferL.length()) {
                        zzFin = new boolean[zzBufferL.length() + 1];
                    }
                    boolean zzFinL[] = zzFin;
                    while (zzFState != -1 && zzFPos < zzMarkedPos) {
                        if ((zzAttrL[zzFState] & 1) == 1) {
                            zzFinL[zzFPos] = true;
                        }
                        zzInput = zzBufferL.charAt(zzFPos++);
                        zzFState = zzTransL[zzRowMapL[zzFState] + zzCMapL[zzInput]];
                    }
                    if (zzFState != -1 && (zzAttrL[zzFState] & 1) == 1) {
                        zzFinL[zzFPos] = true;
                    }

                    zzFState = 16;
                    zzFPos = zzMarkedPos;
                    while (!zzFinL[zzFPos] || (zzAttrL[zzFState] & 1) != 1) {
                        zzInput = zzBufferL.charAt(--zzFPos);
                        zzFState = zzTransL[zzRowMapL[zzFState] + zzCMapL[zzInput]];
                    }
                    ;
                    zzMarkedPos = zzFPos;
                }
                {
                    goToState(S_ARRAY);
                    return ASSIGNMENT_WORD;
                }
                case 188:
                    break;
                case 122: {
                    return PARAM_EXPANSION_OP_COLON_QMARK;
                }
                case 189:
                    break;
                case 53: {
                    goToState(S_ARITH_ARRAY_MODE);
                    return LEFT_SQUARE;
                }
                case 190:
                    break;
                case 161: {
                    return FUNCTION_KEYWORD;
                }
                case 191:
                    break;
                case 43: {
                    return ARITH_GT;
                }
                case 192:
                    break;
                case 60: {
                    paramExpansionWord = true;
                    return WORD;
                }
                case 193:
                    break;
                case 153: {
                    return ELSE_KEYWORD;
                }
                case 194:
                    break;
                case 146: {
                    goToState(S_CASE_PATTERN);
                    if (!isBash4) {
                        yypushback(1);
                    }
                    return CASE_END;
                }
                case 195:
                    break;
                case 4: {
                    return BACKSLASH;
                }
                case 196:
                    break;
                case 157: {
                    backToPreviousState();
                    yypushback(yylength());
                }
                case 197:
                    break;
                case 156: {
                    backToPreviousState();
                    return ESAC_KEYWORD;
                }
                case 198:
                    break;
                case 118: {
                    goToState(S_CASE_PATTERN);
                    if (isBash4) {
                        return CASE_END;
                    } else {
                        yypushback(1);
                        return SEMI;
                    }
                }
                case 199:
                    break;
                case 85: {
                    return ADD_EQ;
                }
                case 200:
                    break;
                case 74: {
                    paramExpansionWord = false;
                    paramExpansionHash = false;
                    paramExpansionOther = false;
                    backToPreviousState();
                    return RIGHT_CURLY;
                }
                case 201:
                    break;
                case 120: {
                    if (!inCaseBody) {
                        inCaseBody = true;
                        goToState(S_CASE_PATTERN);
                    }
                    ;
                    return IN_KEYWORD;
                }
                case 202:
                    break;
                case 35: {
                    return ARITH_BITWISE_XOR;
                }
                case 203:
                    break;
                case 131: {
                    yypushback(1);
                    goToState(S_TEST);
                    emptyConditionalCommand = true;
                    return EXPR_CONDITIONAL;
                }
                case 204:
                    break;
                case 77: {
                    return VARIABLE;
                }
                case 205:
                    break;
                case 119: {
                    goToState(S_CASE_PATTERN);
                    return CASE_END;
                }
                case 206:
                    break;
                case 99: {
                    return COND_OP_REGEX;
                }
                case 207:
                    break;
                case 82: {
                    return FILEDESCRIPTOR;
                }
                case 208:
                    break;
                case 68: {
                    return PARAM_EXPANSION_OP_MINUS;
                }
                case 209:
                    break;
                case 147: {
                    yypushback(2);
                    expectArithExpression = true;
                    startNewArithExpression = false;
                    goToState(S_ARITH);
                    return DOLLAR;
                }
                case 210:
                    break;
                case 17: {
                    return LEFT_PAREN;
                }
                case 211:
                    break;
                case 100: {
                    return COND_OP_EQ_EQ;
                }
                case 212:
                    break;
                case 24: {
                    if (emptyConditionalCommand) {
                        emptyConditionalCommand = false;
                        backToPreviousState();
                        return _EXPR_CONDITIONAL;
                    } else {
                        emptyConditionalCommand = false;
                        return WORD;
                    }
                }
                case 213:
                    break;
                case 59: {
                    return PARAM_EXPANSION_OP_EXCL;
                }
                case 214:
                    break;
                case 104: {
                    return ARITH_ASS_MUL;
                }
                case 215:
                    break;
                case 22: {
                    return RIGHT_CURLY;
                }
                case 216:
                    break;
                case 117: {
                    return ARITH_SHIFT_LEFT;
                }
                case 217:
                    break;
                case 158: {
                    return UNTIL_KEYWORD;
                }
                case 218:
                    break;
                case 30: {
                    return ARITH_MULT;
                }
                case 219:
                    break;
                case 133:
                    // lookahead expression with fixed base length
                    zzMarkedPos = zzStartRead + 2;
                {
                    return REDIRECT_GREATER_AMP;
                }
                case 220:
                    break;
                case 62: {
                    return PARAM_EXPANSION_OP_AT;
                }
                case 221:
                    break;
                case 141:
                    // lookahead expression with fixed base length
                    zzMarkedPos = zzStartRead + 2;
                {
                    yypushback(1);
                    return ARITH_MINUS;
                }
                case 222:
                    break;
                case 121:
                    // lookahead expression with fixed base length
                    zzMarkedPos = zzStartRead + 1;
                {
                    string.enterSubshell();
                    return DOLLAR;
                }
                case 223:
                    break;
                case 2: {
                    return LINE_FEED;
                }
                case 224:
                    break;
                case 92: {
                    return DO_KEYWORD;
                }
                case 225:
                    break;
                case 48: {
                    backToPreviousState();
                    yypushback(1);
                }
                case 226:
                    break;
                case 103: {
                    return ARITH_EXPONENT;
                }
                case 227:
                    break;
                case 114: {
                    return ARITH_GE;
                }
                case 228:
                    break;
                case 6: {
                    return BANG_TOKEN;
                }
                case 229:
                    break;
                case 63: {
                    paramExpansionOther = true;
                    return PARAM_EXPANSION_OP_QMARK;
                }
                case 230:
                    break;
                case 69: {
                    paramExpansionOther = true;
                    return PARAM_EXPANSION_OP_UNKNOWN;
                }
                case 231:
                    break;
                case 5: {
                    return COMMENT;
                }
                case 232:
                    break;
                case 95: {
                    return SHIFT_RIGHT;
                }
                case 233:
                    break;
                case 23: {
                    return COND_OP_NOT;
                }
                case 234:
                    break;
                case 148:
                    // lookahead expression with fixed lookahead length
                    yypushback(3);
                {
                    goToState(S_ASSIGNMENT_LIST);
                    return ASSIGNMENT_WORD;
                }
                case 235:
                    break;
                case 128:
                    // lookahead expression with fixed lookahead length
                    yypushback(2);
                {
                    goToState(S_ASSIGNMENT_LIST);
                    return ASSIGNMENT_WORD;
                }
                case 236:
                    break;
                case 112: {
                    return ARITH_EQ;
                }
                case 237:
                    break;
                case 27: {
                    return NUMBER;
                }
                case 238:
                    break;
                case 94: {
                    return REDIRECT_GREATER_BAR;
                }
                case 239:
                    break;
                case 42: {
                    openParenths++;
                    return LEFT_PAREN;
                }
                case 240:
                    break;
                case 159: {
                    return WHILE_KEYWORD;
                }
                case 241:
                    break;
                case 39: {
                    return LEFT_SQUARE;
                }
                case 242:
                    break;
                case 126:
                    // lookahead expression with fixed base length
                    zzMarkedPos = zzStartRead + 1;
                {
                    return LEFT_SQUARE;
                }
                case 243:
                    break;
                case 56: {
                    if (string.isNewAllowed()) {
                        string.enterSubstring();
                        return STRING_BEGIN; //fixme
                    } else if (string.isInSubstring()) {
                        string.leaveSubstring();
                        return STRING_CHAR;
                    } else {
                        backToPreviousState();
                        return STRING_END;
                    }
                }
                case 244:
                    break;
                case 136: {
                    return REDIRECT_LESS_LESS_LESS;
                }
                case 245:
                    break;
                case 138: {
                    backToPreviousState();
                    return _BRACKET_KEYWORD;
                }
                case 246:
                    break;
                case 72: {
                    return PARAM_EXPANSION_OP_EQ;
                }
                case 247:
                    break;
                case 31: {
                    return ARITH_COLON;
                }
                case 248:
                    break;
                case 152: {
                    return ELIF_KEYWORD;
                }
                case 249:
                    break;
                case 107: {
                    return ARITH_ASS_MINUS;
                }
                case 250:
                    break;
                case 49: {
                    backToPreviousState();
                    if (string != null && string.isInSubshell()) {
                        string.leaveSubshell();
                    }
                    return RIGHT_PAREN;
                }
                case 251:
                    break;
                case 15: {
                    return PIPE;
                }
                case 252:
                    break;
                case 113: {
                    if (expectArithExpression) {
                        expectArithExpression = false;
                        if (startNewArithExpression) {
                            goToState(S_ARITH);
                        }

                        return EXPR_ARITH;
                    } else {
                        yypushback(1);
                        openParenths++;
                        return LEFT_PAREN;
                    }
                }
                case 253:
                    break;
                case 132: {
                    return FOR_KEYWORD;
                }
                case 254:
                    break;
                case 52: {
                    backToPreviousState();
                    goToState(S_ARITH_ARRAY_MODE);
                    return LEFT_SQUARE;
                }
                case 255:
                    break;
                case 160: {
                    return SELECT_KEYWORD;
                }
                case 256:
                    break;
                case 38: {
                    return ARITH_BITWISE_NEGATE;
                }
                case 257:
                    break;
                case 115: {
                    return ARITH_SHIFT_RIGHT;
                }
                case 258:
                    break;
                case 7: {
                    return DOLLAR;
                }
                case 259:
                    break;
                case 3: {
                    return WHITESPACE;
                }
                case 260:
                    break;
                case 137:
                    // lookahead expression with fixed base length
                    zzMarkedPos = zzStartRead + 2;
                {
                    yypushback(1);
                    goToState(S_SUBSHELL_PREFIXED);
                    return DOLLAR;
                }
                case 261:
                    break;
                case 26: {
                    return ARITH_NEGATE;
                }
                case 262:
                    break;
                case 57: {
                    if (string.isFreshSubshell()) {
                        goToState(S_SUBSHELL);
                        return LEFT_PAREN;
                    } else return STRING_CHAR;
                }
                case 263:
                    break;
                case 76: {
                    return SHEBANG;
                }
                case 264:
                    break;
                case 8: {
                    string.reset();
                    goToState(S_STRINGMODE);
                    return STRING_BEGIN;
                }
                case 265:
                    break;
                case 44: {
                    return ARITH_LT;
                }
                case 266:
                    break;
                case 102: {
                    return ARITH_ASS_DIV;
                }
                case 267:
                    break;
                case 79: {
                    goToState(S_PARAM_EXPANSION);
                    yypushback(1);
                    return DOLLAR;
                }
                case 268:
                    break;
                case 90: {
                    return OR_OR;
                }
                case 269:
                    break;
                case 46: {
                    backToPreviousState();
                    return _EXPR_ARITH_SQUARE;
                }
                case 270:
                    break;
                case 134:
                    // lookahead expression with fixed base length
                    zzMarkedPos = zzStartRead + 2;
                {
                    return REDIRECT_LESS_AMP;
                }
                case 271:
                    break;
                case 87: {
                    return IN_KEYWORD;
                }
                case 272:
                    break;
                case 25: {
                    return COND_OP;
                }
                case 273:
                    break;
                case 28: {
                    return ARITH_DIV;
                }
                case 274:
                    break;
                case 47: {
                    backToPreviousState();
                    return RIGHT_SQUARE;
                }
                case 275:
                    break;
                case 11: {
                    return AT;
                }
                case 276:
                    break;
                case 155: {
                    return DONE_KEYWORD;
                }
                case 277:
                    break;
                case 139: {
                    yypushback(2);
                    expectArithExpression = true;
                    startNewArithExpression = true;
                    return DOLLAR;
                }
                case 278:
                    break;
                case 18: {
                    return GREATER_THAN;
                }
                case 279:
                    break;
                case 50: {
                    goToState(S_SUBSHELL);
                    return LEFT_PAREN;
                }
                case 280:
                    break;
                case 14: {
                    return RIGHT_PAREN;
                }
                case 281:
                    break;
                case 75: { /* ignored */
                }
                case 282:
                    break;
                case 78: {
                    yypushback(1);
                    goToState(S_ARITH_SQUARE_MODE);
                    return DOLLAR;
                }
                case 283:
                    break;
                case 51: {
                    backToPreviousState();
                    goToState(S_SUBSHELL);
                    return LEFT_PAREN;
                }
                case 284:
                    break;
                case 73: {
                    paramExpansionWord = false;
                    paramExpansionHash = false;
                    paramExpansionOther = false;
                    return LEFT_CURLY;
                }
                case 285:
                    break;
                case 34: {
                    return ARITH_MINUS;
                }
                case 286:
                    break;
                case 12: {
                    return AMP;
                }
                case 287:
                    break;
                case 71: {
                    if (!paramExpansionOther && (!paramExpansionWord || !paramExpansionHash)) {
                        // If we expect an array reference parse the next tokens as arithmetic expression
                        goToState(S_ARITH_ARRAY_MODE);
                    }

                    return LEFT_SQUARE;
                }
                case 288:
                    break;
                case 111: {
                    if (openParenths > 0) {
                        openParenths--;
                        yypushback(1);
                        return RIGHT_PAREN;
                    } else {
                        string.advanceToken();
                        backToPreviousState();
                        return _EXPR_ARITH;
                    }
                }
                case 289:
                    break;
                case 108: {
                    return ARITH_PLUS_PLUS;
                }
                case 290:
                    break;
                case 130: {
                    goToState(S_TEST_COMMAND);
                    return BRACKET_KEYWORD;
                }
                case 291:
                    break;
                case 142: {
                    return ARITH_HEX_NUMBER;
                }
                case 292:
                    break;
                case 80: {
                    return STRING2;
                }
                case 293:
                    break;
                case 129: {
                    if (isBash4) {
                        return REDIRECT_AMP_GREATER_GREATER;
                    } else {
                        yypushback(2);
                        return AMP;
                    }
                }
                case 294:
                    break;
                case 101: {
                    return ARITH_NE;
                }
                case 295:
                    break;
                case 40: {
                    return RIGHT_SQUARE;
                }
                case 296:
                    break;
                case 20: {
                    if (yystate() == S_BACKQUOTE) backToPreviousState();
                    else goToState(S_BACKQUOTE);
                    return BACKQUOTE;
                }
                case 297:
                    break;
                case 143: {
                    return ARITH_ASS_SHIFT_RIGHT;
                }
                case 298:
                    break;
                case 144: {
                    return ARITH_ASS_SHIFT_LEFT;
                }
                case 299:
                    break;
                case 116: {
                    return ARITH_LE;
                }
                case 300:
                    break;
                case 70: {
                    return PARAM_EXPANSION_OP_PLUS;
                }
                case 301:
                    break;
                case 88: {
                    return IF_KEYWORD;
                }
                case 302:
                    break;
                case 1: {
                    return BAD_CHARACTER;
                }
                case 303:
                    break;
                case 124: {
                    return PARAM_EXPANSION_OP_COLON_PLUS;
                }
                case 304:
                    break;
                case 110: {
                    return ARITH_OCTAL_NUMBER;
                }
                case 305:
                    break;
                case 37: {
                    return COMMA;
                }
                case 306:
                    break;
                case 45: {
                    return EXPR_ARITH_SQUARE;
                }
                case 307:
                    break;
                case 98: {
                    backToPreviousState();
                    emptyConditionalCommand = false;
                    return _EXPR_CONDITIONAL;
                }
                case 308:
                    break;
                case 32: {
                    return ARITH_BITWISE_AND;
                }
                case 309:
                    break;
                case 140: {
                    return ARITH_BASE_NUMBER;
                }
                case 310:
                    break;
                case 21: {
                    return LEFT_CURLY;
                }
                case 311:
                    break;
                case 89: {
                    if (isBash4)
                        return PIPE_AMP;
                    else {
                        yypushback(1);
                        return PIPE;
                    }
                }
                case 312:
                    break;
                case 16: {
                    return EQ;
                }
                case 313:
                    break;
                case 123: {
                    return PARAM_EXPANSION_OP_COLON_MINUS;
                }
                case 314:
                    break;
                case 125: {
                    return PARAM_EXPANSION_OP_COLON_EQ;
                }
                case 315:
                    break;
                case 9: {
                    return INTEGER_LITERAL;
                }
                case 316:
                    break;
                case 93: {
                    return FI_KEYWORD;
                }
                case 317:
                    break;
                case 10: {
                    return WORD;
                }
                case 318:
                    break;
                case 61: {
                    paramExpansionOther = true;
                    return PARAM_EXPANSION_OP_SLASH;
                }
                case 319:
                    break;
                case 86: {
                    goToState(S_TEST);
                    emptyConditionalCommand = false;
                    return EXPR_CONDITIONAL;
                }
                case 320:
                    break;
                case 83: {
                    return AND_AND;
                }
                case 321:
                    break;
                case 29: {
                    return ARITH_QMARK;
                }
                case 322:
                    break;
                default:
                    if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
                        zzAtEOF = true;
                        return null;
                    } else {
                        zzScanError(ZZ_NO_MATCH);
                    }
            }
        }
    }


}
